<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>9.WeakSet弱引用特性</title>
</head>

<body>
  <script>
    let hd = { name: '后盾人' }; // 计数 +1
    let edu = hd; //+1

    let weakSet = new WeakSet();
    weakSet.add(hd);

    // 此时 引用计数器归零，引用会被回收，但是英文weakSet是弱引用，引用回收不会通知weakSet，所以此时打印weakSet 引用还存在，但是Prototype在内存中找不到任何引用
    /*WeakSet {{…}}
    [[Entries]]
    No properties
    [[Prototype]]: WeakSet*/

    console.log(weakSet);
    hd = null; // -1
    edu = null; // -1

    //垃圾回收对象被移除，wekset也就没有记录了
    //由于垃圾回收是系统进行而不是实时回收，所以间隔1s再打印 ,weakSet的引用就被回收了 WeakSet {}
    setTimeout(() => { console.log(weakSet) }, 1000);
    // 由于weakSet 内的元素是有可能被回收的，是不转的，因此 interator/of, for/of ，keys/ ，size ，方法都不支持
    console.log(weakSet.size); //undefined
  /*  for(const iterator of weakSet){
      console.log(iterator); //Uncaught TypeError: weakSet is not iterable

    }*/
    console.log(weakSet.keys()); //Uncaught TypeError: weakSet.keys is not a function

  </script>
</body>

</html>